package com.compmov.socialnetwork;

import java.io.File;
import java.io.IOException;
import java.util.List;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.compmov.datamodel.Comentario;
import com.compmov.datamodel.Foto;
import com.compmov.datamodel.Lugar;
import com.compmov.datamodel.LugarAgregado;
import com.compmov.datamodel.Persona;
import com.compmov.datamodel.TipoLugar;
import com.compmov.webservice.ComentarioWSClient;
import com.compmov.webservice.FotoWSClient;
import com.compmov.webservice.LugarAgregadoWSClient;
import com.compmov.webservice.TipoLugarWSClient;
import com.compmov.webservice.WSClientException;

public class Agregar extends Activity {

	private ImageButton camera;
	private ImageButton gallery;
	private EditText nombre;
	private EditText descripcion;
	private EditText comentario;
	private Spinner ranking;
	private TextView indicador;
	private String urlFoto="";
	private String path;
	private Spinner spinner;
	private Uri outputFileUri;
	private double longitude=0;
	private double latitude=0;
	private String[] tiposLugares;
	private Integer[] idTiposLugares;
	
	public static final String TAG ="WEBSERVICE";
	
	TipoLugarWSClient tipoLugarWS = new TipoLugarWSClient("tipolugar");

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.agregar);
		path = Environment.getExternalStorageDirectory() + "/";
		this.camera = (ImageButton) findViewById(R.id.imgCamera);
		this.gallery = (ImageButton) findViewById(R.id.imgGallery);
		this.nombre =(EditText) findViewById(R.id.nombre);
		this.descripcion =(EditText) findViewById(R.id.descripcion);
		this.comentario =(EditText) findViewById(R.id.comentario);
		this.ranking =(Spinner) findViewById(R.id.ranking);
		this.indicador =(TextView)findViewById(R.id.indicador);
		
		spinner = (Spinner) findViewById(R.id.tipolugar);
		
		try {
			List<TipoLugar> tipoLugares = tipoLugarWS.getAll();
			tiposLugares = new String[tipoLugares.size()];
			idTiposLugares = new Integer[tipoLugares.size()];
			int i=0;
			
			for (TipoLugar tl : tipoLugares){
				tiposLugares[i] = tl.getDescripcion();
				idTiposLugares[i] = tl.getId();
				i++;
			}
			
			ArrayAdapter<String> adapter = new ArrayAdapter<String>(
		            this,android.R.layout.simple_spinner_item,tiposLugares);
		    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		    spinner.setAdapter(adapter);
		    
		} catch (WSClientException e) {
			// TODO Auto-generated catch block		
			Log.d(TAG,e.getMessage());			
		}
		
		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
	            this, R.array.numero_ranking2, android.R.layout.simple_spinner_item);
	    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	    ranking.setAdapter(adapter);
		
		camera.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				urlFoto = Environment.getExternalStorageDirectory().getAbsolutePath()
				+ "/TEMP.jpg";

				File file = new File(urlFoto);
				if(!file.exists()){
				try {
					file.createNewFile();
				} catch (IOException e) {
					Log.e("WEBSERVICE",e.getMessage(),e);
				}
			 	}
				outputFileUri=Uri.fromFile(file);
			
				Intent intent = new Intent(
						android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
				startActivityForResult(intent, 1);
				
			}
		});

		gallery.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				Intent intent = new Intent();
				intent.setType("image/*");
				intent.setAction(Intent.ACTION_GET_CONTENT);
				startActivityForResult(Intent.createChooser(intent, path), 2);
			}
		});

	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(resultCode==0){
			Toast notificacionToast = Toast.makeText(getApplicationContext(),
					"La imagen no pudo se cargada", Toast.LENGTH_SHORT);
			notificacionToast.show();
			return;
		}
		
		switch (requestCode) {
		case 1:
			try {

				ContentResolver cr = getApplicationContext()
						.getContentResolver();
				Cursor c = cr.query(outputFileUri, new String[] {
						MediaStore.Images.ImageColumns.DATA,
						MediaStore.Images.ImageColumns.LATITUDE,
						MediaStore.Images.ImageColumns.LONGITUDE }, null, null,
						null);

				if (c != null) {
					c.moveToFirst();
					latitude = c
							.getDouble(c
									.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.LATITUDE));
					longitude = c
							.getDouble(c
									.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.LONGITUDE));

				} else {
					try {
						LocationManager lm = (LocationManager) this
								.getSystemService(Context.LOCATION_SERVICE);
						Criteria crit = new Criteria();
						crit.setAccuracy(Criteria.ACCURACY_FINE);
						String provider = lm.getBestProvider(crit, true);
						Location loc = lm.getLastKnownLocation(provider);
						latitude = loc.getLatitude();
						longitude = loc.getLongitude();
					} catch (Exception ex) {
					}
				}

			} catch (Exception e) {
				Toast notificacionToast = Toast.makeText(getApplicationContext(),
						"Error en captura. Intente de nuevo", Toast.LENGTH_SHORT);
				notificacionToast.show();
				return;
			}
			
			
			
			
			indicador.setText("Imagen obtenida de la Camara");
			
			break;

		case 2:
			Uri uri = data.getData();
			
			ContentResolver cr = getApplicationContext()
			.getContentResolver();
			
			try{
				Cursor c = cr.query(uri, new String[] {
						MediaStore.Images.ImageColumns.DATA,
						MediaStore.Images.ImageColumns.LATITUDE,
						MediaStore.Images.ImageColumns.LONGITUDE }, null, null,
						null);
				

				if (c != null) {
					c.moveToFirst();
					latitude =c.getDouble(c
							.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.LATITUDE));
					longitude = c.getDouble(c
							.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.LONGITUDE));
					
					if(latitude==0 && longitude==0){
						Toast notificacionToast = Toast.makeText(getApplicationContext(),
								"La imagen no tiene geolocalizacion", Toast.LENGTH_SHORT);
						notificacionToast.show();
						return;
					}
					urlFoto=getPath(uri);
					
					indicador.setText("Imagen obtenida de la Galeria");
				}else{
					Toast notificacionToast = Toast.makeText(getApplicationContext(),
							"La imagen no tiene geolocalizacion", Toast.LENGTH_SHORT);
					notificacionToast.show();
					break;
				}
				
			}catch(Exception ex){
				
				Toast notificacionToast = Toast.makeText(getApplicationContext(),
						"La imagen no tiene geolocalizacion", Toast.LENGTH_SHORT);
				notificacionToast.show();
				
			}
			
			break;

		}

		
	}
	
	public void realizarGuardado(View v){
		if(nombre.getText().toString().length()==0){
			Toast notificacionToast = Toast.makeText(getApplicationContext(),
					"Indique el nombre del lugar", Toast.LENGTH_SHORT);
			notificacionToast.show();
			return;
		}
		if(descripcion.getText().length()==0){
			Toast notificacionToast = Toast.makeText(getApplicationContext(),
					"Indique la descripcion del lugar", Toast.LENGTH_SHORT);
			notificacionToast.show();
			return;
		}
		
		if(urlFoto.length()==0){
			Toast notificacionToast = Toast.makeText(getApplicationContext(),
					"Por favor suba una foto", Toast.LENGTH_SHORT);
			notificacionToast.show();
			return;
		}
		
		if(comentario.getText().length()==0){
			Toast notificacionToast = Toast.makeText(getApplicationContext(),
					"Indique un comentario", Toast.LENGTH_SHORT);
			notificacionToast.show();
			return;
		}
		/*Agrego Lugar*/
		Lugar lug= new Lugar(0,nombre.getText().toString(),descripcion.getText().toString(),
				latitude,longitude,0,"");
		TipoLugar tip=new TipoLugar();
		int index=spinner.getSelectedItemPosition();
		tip.setId(idTiposLugares[index]);
		lug.setTipo(tip);
		
		LugarAgregado lugarA=new LugarAgregado(1,com.compmov.libraries.Utils.obtenFecha(), com.compmov.libraries.Utils.getPersona(), lug);	
		
		LugarAgregadoWSClient lugarAgregadoWS = new LugarAgregadoWSClient("lugaragregado");
		
		
		try{
			lug=lugarAgregadoWS.agregarLugar(lugarA);
		} catch (WSClientException e) {
			Toast.makeText(getBaseContext(),"Error en el servidor. Intente de nuevo",
					Toast.LENGTH_SHORT).show();
			return;
		}
		
		/*Subo Foto*/
		FotoWSClient fotoWS = new FotoWSClient("fotos");
		Foto foto1=new Foto(0,urlFoto, new Persona(), new Lugar());
		foto1.setLugar(lug);
		foto1.setPersona(com.compmov.libraries.Utils.getPersona());
		try{
			fotoWS.subirFoto(foto1);
		} catch (WSClientException e) {
			Toast.makeText(getBaseContext(),"Error en el servidor. Intente de nuevo",
					Toast.LENGTH_SHORT).show();
			return;
		}
				
		/*Agrego Comentario*/
		Persona per=com.compmov.libraries.Utils.getPersona();
		String fecha=com.compmov.libraries.Utils.obtenFecha();
		Comentario com= new Comentario(0,comentario.getText().toString(), 5-ranking.getSelectedItemPosition(),
				fecha,per,lug);
		ComentarioWSClient comentWS=new ComentarioWSClient("comentario");
		try{
			comentWS.addComentario(com);
		} catch (WSClientException e) {
			Toast.makeText(getBaseContext(),"Error en el servidor. Intente de nuevo",
					Toast.LENGTH_SHORT).show();
			return;
		}
		
		
		
		Toast notificacionToast = Toast.makeText(getApplicationContext(),
				"Lugar Agregado ", Toast.LENGTH_SHORT);
		notificacionToast.show();
		this.finish();
	}

	
	/**
	 * Extrae el path desde un URI
	 * 
	 * @param uri
	 * @return
	 */
	public String getPath(Uri uri) {
		String[] projection = { MediaStore.Images.Media.DATA };
		Cursor cursor = managedQuery(uri, projection, null, null, null);
		int column_index = cursor
				.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		cursor.moveToFirst();
		return cursor.getString(column_index);
	}
}